#include <iostream>
#include <functional>
#include <memory>

class classA
{
    typedef std::function<void(int i)> callback_t;

public:
    classA() {}
    ~classA() {}

    void handle(int i)
    {
        std::cout << "classA::handle" << std::endl;
        std::cout << "---------------------" << std::endl;

        cbHandle(i);
    }

    void registCb(callback_t func)
    {
        cbHandle = std::move(func);
    }

private:
    callback_t cbHandle;
};

class classB
{
public:
    classB(classA &cA)
    {
        cA.registCb([this](int i) { handle(i); });
    }
    ~classB() {}

    void handle(int i)
    {
        std::cout << "classB, handle message: " << i << std::endl;
    }
};

// classB注册一个成员函数作为回调函数到classA中，classA会保存这个回调函数（std::function对象）到成员变量中，用于后面使用
// lambda表达式中捕获了classB的this指针
// 使用std::move的方式保存function对象到classA中

int main()
{
    classA testa;
    classB testb(testa);

    testa.handle(10);
}